﻿using System;
using System.Reflection;
using System.Windows.Forms;
using System.Collections.Generic;

namespace QL_Truong_Hoc.KhungDaoTao
{
    public partial class frmKhungVanHoa : DevExpress.XtraEditors.XtraForm
    {
        private const string mcstrRoleCode = "khung_van_hoa";
        private clsEnum.FORM_MODE memMode;
        private clsEnum.TRINH_DO_DAO_TAO memTrinhDo;

        private int mintNextID = -1;

        public frmKhungVanHoa(clsEnum.FORM_MODE emMode)
        {
            InitializeComponent();

            this.memMode = emMode;
            this.memTrinhDo = clsEnum.TRINH_DO_DAO_TAO.TRUNG_CAP;
        }

        private void frmKhungVanHoa_Load(object sender, EventArgs e)
        {
            if (!clsCommon.fncCheckRole(Program.glstRoles, mcstrRoleCode))
            {
                this.BeginInvoke(new MethodInvoker(this.Close));
                return;
            }

            // TODO: This line of code loads data into the 'qLTHDataSet.mMonVanHoa' table. You can move, or remove it, as needed.
            this.mMonVanHoaTableAdapter.Fill(this.qLTHDataSet.mMonVanHoa);
            // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoaMon' table. You can move, or remove it, as needed.
            this.mKhungVanHoaMonTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoaMon);
            // TODO: This line of code loads data into the 'qLTHDataSet.mKhoaHoc' table. You can move, or remove it, as needed.
            this.mKhoaHocTableAdapter.Fill(this.qLTHDataSet.mKhoaHoc);
            // TODO: This line of code loads data into the 'qLTHDataSet.mTrinhDoDaoTao' table. You can move, or remove it, as needed.
            this.mTrinhDoDaoTaoTableAdapter.Fill(this.qLTHDataSet.mTrinhDoDaoTao);
            // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoa' table. You can move, or remove it, as needed.
            this.mKhungVanHoaTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoa);

            xSetFormMode(this.memMode);
            Program.gevnApplication.evnMasterUpdate += new clsEvents.dgaMasterUpdateHandler(xMasterUpdate);
        }

        private void xMasterUpdate()
        {
            try
            {
                if (!clsCommon.fncMsgConfirm("Danh mục dùng chung đã thay đổi. Bạn có muốn cập nhật mới dữ liệu?")) return;

                // TODO: This line of code loads data into the 'qLTHDataSet.mMonVanHoa' table. You can move, or remove it, as needed.
                this.mMonVanHoaTableAdapter.Fill(this.qLTHDataSet.mMonVanHoa);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoaMon' table. You can move, or remove it, as needed.
                this.mKhungVanHoaMonTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoaMon);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhoaHoc' table. You can move, or remove it, as needed.
                this.mKhoaHocTableAdapter.Fill(this.qLTHDataSet.mKhoaHoc);
                // TODO: This line of code loads data into the 'qLTHDataSet.mTrinhDoDaoTao' table. You can move, or remove it, as needed.
                this.mTrinhDoDaoTaoTableAdapter.Fill(this.qLTHDataSet.mTrinhDoDaoTao);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoa' table. You can move, or remove it, as needed.
                this.mKhungVanHoaTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoa);

                dgvKhung.RefreshData();
                dgvMonChiTiet.RefreshData();
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private bool xSetFormMode(clsEnum.FORM_MODE emMode)
        {
            bool blnResult = false;
            try
            {
                this.memMode = emMode;

                switch (emMode)
                {
                    case clsEnum.FORM_MODE.VIEW:
                        mniSave.Enabled = false;
                        mniAdd.Enabled = true;
                        mniEdit.Enabled = true;
                        mniDelete.Enabled = true;
                        mniCancel.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;

                        //clear combobox
                        cbKhoas.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True;
                        cbKhoas.SendKey(new KeyEventArgs(Keys.Control | Keys.Delete));

                        //xóa grid
                        mKhungVanHoaMonBindingSource.Filter = string.Format("KVH_ID = {0}", clsConst.gcintNoneValue);

                        //disable để tránh bị sửa
                        cbKhoas.Properties.ReadOnly = true;
                        dgvMonChiTiet.OptionsBehavior.Editable = false;

                        break;

                    case clsEnum.FORM_MODE.ADD:
                        mniSave.Enabled = true;
                        mniAdd.Enabled = false;
                        mniEdit.Enabled = false;
                        mniDelete.Enabled = false;
                        mniCancel.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;

                        //enable control
                        cbKhoas.Properties.ReadOnly = false;
                        dgvMonChiTiet.OptionsBehavior.Editable = true;

                        //clear combobox
                        cbKhoas.SendKey(new KeyEventArgs(Keys.Control | Keys.Delete));

                        //xóa grid
                        mintNextID = DAO.MKhungVanHoaDAO.SelectNextIndex(Program.gobjDb);

                        //thêm 4 môn văn hóa
                        dgvMonChiTiet.AddNewRow();
                        dgvMonChiTiet.SetFocusedRowCellValue(colKVH_ID_mon, mintNextID);
                        dgvMonChiTiet.SetFocusedRowCellValue(colMVH_ID, (int)clsEnum.MON_VAN_HOA.VAN);

                        dgvMonChiTiet.AddNewRow();
                        dgvMonChiTiet.SetFocusedRowCellValue(colKVH_ID_mon, mintNextID);
                        dgvMonChiTiet.SetFocusedRowCellValue(colMVH_ID, (int)clsEnum.MON_VAN_HOA.TOAN);

                        dgvMonChiTiet.AddNewRow();
                        dgvMonChiTiet.SetFocusedRowCellValue(colKVH_ID_mon, mintNextID);
                        dgvMonChiTiet.SetFocusedRowCellValue(colMVH_ID, (int)clsEnum.MON_VAN_HOA.LY);

                        dgvMonChiTiet.AddNewRow();
                        dgvMonChiTiet.SetFocusedRowCellValue(colKVH_ID_mon, mintNextID);
                        dgvMonChiTiet.SetFocusedRowCellValue(colMVH_ID, (int)clsEnum.MON_VAN_HOA.HOA);

                        mKhungVanHoaMonBindingSource.Filter = string.Format("KVH_ID = {0}", mintNextID);

                        break;

                    case clsEnum.FORM_MODE.EDIT:
                        mniSave.Enabled = true;
                        mniAdd.Enabled = false;
                        mniEdit.Enabled = false;
                        mniDelete.Enabled = true;
                        mniCancel.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;

                        //enable control
                        cbKhoas.Properties.ReadOnly = false;
                        dgvMonChiTiet.OptionsBehavior.Editable = true;

                        break;
                }

                return true;
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
            return blnResult;
        }

        private void mniSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                //check valid trước khi tiếp tục
                if (!validControlBlank.Validate()) return;

                switch (this.memMode)
                {
                    case clsEnum.FORM_MODE.ADD:
                        if (xAddNew())
                        {
                            //this.mKhungVanHoaTableAdapter.GetData();
                            this.mKhungVanHoaTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoa);
                            xSetFormMode(clsEnum.FORM_MODE.VIEW);
                        }
                        break;

                    case clsEnum.FORM_MODE.EDIT:
                        if (xUpdate())
                        {
                            //this.mKhungVanHoaTableAdapter.GetData();
                            this.mKhungVanHoaTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoa);
                            xSetFormMode(clsEnum.FORM_MODE.VIEW);
                        }
                        break;
                }
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private void mniAdd_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                xSetFormMode(clsEnum.FORM_MODE.ADD);
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private void mniEdit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                mintNextID = clsCommon.fncCnvNullToInt(dgvKhung.GetFocusedRowCellValue(colKVH_ID));

                if (mintNextID <= 0)
                {
                    clsCommon.fncMsgInfo("Hãy chọn một giá trị để sửa.");
                    dgvKhung.Focus();
                    return;
                }

                xEdit(mintNextID);
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private void mniCancel_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                if (!clsCommon.fncMsgConfirm("Dữ liệu sẽ không được lưu. Bạn có chắc muốn hủy?")) return;

                //mKhungVanHoaMonTableAdapter.GetData();
                mKhungVanHoaMonTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoaMon);

                xSetFormMode(clsEnum.FORM_MODE.VIEW);
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private bool xView(int intID)
        {
            bool blnResult = false;
            try
            {
                //lấy dữ liệu
                DTO.MKhungVanHoaDTO objKVH = DAO.MKhungVanHoaDAO.Select(Program.gobjDb, intID);

                //fill combobox
                cbKhoas.Properties.ReadOnly = false;
                cbKhoas.EditValue = objKVH.KHS_ID;
                cbKhoas.Properties.ReadOnly = true;

                //fill grid
                mKhungVanHoaMonBindingSource.Filter = string.Format("KVH_ID = {0}", intID);
            }
            catch (Exception ex)
            {
                clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message);
            }
            return blnResult;
        }

        private bool xAddNew()
        {
            bool blnResult = false;
            try
            {
                dgvMonChiTiet.CloseEditor();
                dgvMonChiTiet.UpdateCurrentRow();
                if (clsCommon.fncMsgConfirm("Dữ liệu sẽ được lưu. Bạn có chắc chắn?"))
                {
                    //thêm mới khung đào tạo
                    DTO.MKhungVanHoaDTO objKVH = new DTO.MKhungVanHoaDTO();
                    objKVH.KVH_ID = mintNextID;                   //id khung đào tạo
                    objKVH.TD_ID = (int)this.memTrinhDo;          //trình độ
                    objKVH.KHS_ID = (int)cbKhoas.EditValue;     //khóa học

                    //insert db khung đào tạo
                    DAO.MKhungVanHoaDAO.Insert(Program.gobjDb, Program.gobjTrans, objKVH);

                    //insert db khung đào tạo + môn học
                    mKhungVanHoaMonTableAdapter.Update(this.qLTHDataSet.mKhungVanHoaMon);

                    return true;
                }
            }
            catch (Exception ex)
            {
                clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message);
                clsCommon.fncMsgError("Lưu dữ liệu không thành công. Hãy kiểm tra dữ liệu và thử lại.");
            }
            return blnResult;
        }

        private bool xUpdate()
        {
            bool blnResult = false;
            try
            {
                dgvMonChiTiet.CloseEditor();
                dgvMonChiTiet.UpdateCurrentRow();
                if (clsCommon.fncMsgConfirm("Dữ liệu sẽ được lưu. Bạn có chắc chắn?"))
                {
                    //thêm mới khung đào tạo
                    DTO.MKhungVanHoaDTO objKVH = new DTO.MKhungVanHoaDTO();
                    objKVH.KVH_ID = mintNextID;                   //id khung đào tạo
                    objKVH.TD_ID = (int)this.memTrinhDo;          //trình độ
                    objKVH.KHS_ID = (int)cbKhoas.EditValue;     //khóa học

                    //insert db khung đào tạo
                    DAO.MKhungVanHoaDAO.Update(Program.gobjDb, Program.gobjTrans, objKVH);

                    //insert db khung đào tạo + môn học
                    mKhungVanHoaMonTableAdapter.Update(this.qLTHDataSet.mKhungVanHoaMon);

                    return true;
                }
            }
            catch (Exception ex)
            {
                clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message);
                clsCommon.fncMsgError("Lưu dữ liệu không thành công. Hãy kiểm tra dữ liệu và thử lại.");
            }
            return blnResult;
        }

        private bool xEdit(int intID)
        {
            bool blnResult = false;
            try
            {
                //hiển thị dữ liệu
                xView(intID);

                //set form sang edit mode
                xSetFormMode(clsEnum.FORM_MODE.EDIT);
            }
            catch (Exception ex)
            {
                clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message);
            }
            return blnResult;
        }

        private void dgvKhung_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            try
            {
                //chỉ kích hoạt ở trạng thái view
                if (this.memMode != clsEnum.FORM_MODE.VIEW) return;

                //chỉ kích hoạt với chuột trái
                if (e.Button != System.Windows.Forms.MouseButtons.Left) return;

                mintNextID = clsCommon.fncCnvNullToInt(dgvKhung.GetFocusedRowCellValue(colKVH_ID));

                if (mintNextID <= 0)
                { return; }

                xView(mintNextID);
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }

        private void mniDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            //tìm xem có bao nhiêu lớp trong khung đào tạo. nếu có thì không cho xóa.
            int intKvhID;
            List<DTO.MLopVanHoaDTO> lstLop;
            bool blnHasLop = true;          //cờ xác định xem có lớp hay không
            bool blnSuccess = true;

            //intKdtID = clsCommon.fncCnvNullToInt(dgvKhung.GetFocusedRowCellValue(colKDT_ID1));
            //intKvhID = mintNextID;

            intKvhID = clsCommon.fncCnvNullToInt(dgvKhung.GetFocusedRowCellValue(colKVH_ID));

            if (intKvhID <= 0)
            {
                clsCommon.fncMsgInfo("Hãy chọn một giá trị để xóa.");
                dgvKhung.Focus();
                return;
            }

            lstLop = DAO.MLopVanHoaDAO.SelectWhere(Program.gobjDb, string.Format("KVH_ID = {0}", intKvhID));

            if (lstLop == null) blnHasLop = false;
            if (lstLop.Count <= 0) blnHasLop = false;

            if (blnHasLop)
            {
                clsCommon.fncMsgWarning("Đang có lớp văn hóa trong khung đào tạo này. \nHãy xóa hết các lớp học trước khi xóa khung đào tạo này.");
                return;
            }
            else
            {
                if (!clsCommon.fncMsgConfirm("Bạn có chắc muốn xóa khung đào tạo này?")) return;

                Program.gobjTrans = Program.gobjConn.BeginTransaction();

                try
                {
                    blnSuccess = blnSuccess && DAO.MKhungVanHoaDAO.Delete(Program.gobjDb, Program.gobjTrans, intKvhID);
                    DAO.MKhungVanHoaMonDAO.Delete(Program.gobjDb, Program.gobjTrans, string.Format("KVH_ID = {0}", intKvhID));
                }
                catch { Program.gobjTrans.Rollback(); }
                finally
                {
                    if (blnSuccess) { 
                        Program.gobjTrans.Commit(); 
                        btnRefresh_ItemClick(null, null);
                        xSetFormMode(clsEnum.FORM_MODE.VIEW);
                    }
                    else { Program.gobjTrans.Rollback(); clsCommon.fncMsgError("Xóa khung đào tạo thất bại. Xin hãy thử lại."); }
                }
            }
        }

        private void btnRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                // TODO: This line of code loads data into the 'qLTHDataSet.mMonVanHoa' table. You can move, or remove it, as needed.
                this.mMonVanHoaTableAdapter.Fill(this.qLTHDataSet.mMonVanHoa);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoaMon' table. You can move, or remove it, as needed.
                this.mKhungVanHoaMonTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoaMon);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhoaHoc' table. You can move, or remove it, as needed.
                this.mKhoaHocTableAdapter.Fill(this.qLTHDataSet.mKhoaHoc);
                // TODO: This line of code loads data into the 'qLTHDataSet.mTrinhDoDaoTao' table. You can move, or remove it, as needed.
                this.mTrinhDoDaoTaoTableAdapter.Fill(this.qLTHDataSet.mTrinhDoDaoTao);
                // TODO: This line of code loads data into the 'qLTHDataSet.mKhungVanHoa' table. You can move, or remove it, as needed.
                this.mKhungVanHoaTableAdapter.Fill(this.qLTHDataSet.mKhungVanHoa);

                xSetFormMode(this.memMode);
            }
            catch (Exception ex) { clsCommon.fncMsgError(MethodBase.GetCurrentMethod().ReflectedType.Name, MethodBase.GetCurrentMethod().Name, ex.Message); }
        }
    }
}